home *** CD-ROM | disk | FTP | other *** search
/ ...taking it to the Macs! / ...taking it to the Macs!.iso / Extras / ActiveX Mac SDK / ActiveX SDK / Containers / SimpleApp / CDragDrop.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  1996-11-26  |  6.6 KB  |  290 lines  |  [TEXT/CWIE]

  1.  
  2.  
  3. /* cDragDrop.cpp
  4. *
  5. *
  6. *
  7. *
  8. */
  9.  
  10. #include "headers.h"
  11. #include <drag.h>
  12. #include "CDragDrop.h"
  13. #include "CSimpleAppSite.h"
  14. #include "App.h"
  15.  
  16. pascal OSErr drag_HandleTrack(DragTrackingMessage Message, WindowPtr pWindow, 
  17.                                 void* HandlerRefCon, DragReference DragRef);
  18. pascal OSErr drag_HandleDrop(WindowPtr pWindow, void* HandlerRefCon, DragReference DragRef);
  19.  
  20. pascal OSErr drag_SendData(FlavorType Flavor, void *HandlerRefCon, ItemReference Item, DragReference DragRef);
  21.  
  22.  
  23. /**[r******************************************************************
  24.  * NewDragDrop
  25.  *
  26.  * DESCRIPTION: Constructor and Installs Mac drag handlers
  27.  *
  28.  *
  29.  **r]*******************************************************************/
  30. CDragDrop* CDragDrop::NewDragDrop(WindowPtr pWindow)
  31. {
  32.     CDragDrop*     pDragDrop = NULL;
  33.     
  34.     pDragDrop = new CDragDrop;
  35.     if ( !pDragDrop )
  36.         return nil;
  37.     
  38.     if ( pDragDrop->Initialize(pWindow) != noErr )
  39.     {
  40.         delete pDragDrop;
  41.         return nil;
  42.     }
  43.  
  44.     return pDragDrop;
  45. }
  46.  
  47.  
  48. /**[r******************************************************************
  49.  * Initialize
  50.  *
  51.  *
  52.  *
  53.  **r]*******************************************************************/
  54. OSErr CDragDrop::Initialize(WindowPtr pWindow)
  55. {
  56.     OSErr     Error = noErr;
  57.     Boolean TrackerInstalled = false;
  58.     
  59.     Window = pWindow;
  60.     
  61.     DragTrackingHandler = NewDragTrackingHandlerProc(drag_HandleTrack);
  62.     DragReceiveHandler = NewDragReceiveHandlerProc(drag_HandleDrop);
  63.     
  64.     if ( (Error = InstallTrackingHandler(DragTrackingHandler, pWindow, (void*) this)) != noErr )
  65.         goto cleanup;
  66.     TrackerInstalled = true;
  67.         
  68.     if ( (Error = InstallReceiveHandler(DragReceiveHandler, pWindow, (void*) this)) != noErr )
  69.         goto cleanup;
  70.         
  71.     return Error;
  72.  
  73. cleanup:
  74.     if (TrackerInstalled)
  75.         RemoveTrackingHandler(DragTrackingHandler, pWindow);
  76.     if ( DragTrackingHandler )
  77.         DisposeRoutineDescriptor(DragTrackingHandler);
  78.     if ( DragReceiveHandler )
  79.         DisposeRoutineDescriptor(DragReceiveHandler);
  80.         
  81.     return Error;
  82. }
  83.  
  84. /**[r******************************************************************
  85.  * CDragDrop
  86.  *
  87.  * DESCRIPTION: Constructor and Installs Mac drag handlers
  88.  *
  89.  *
  90.  **r]*******************************************************************/
  91.  CDragDrop::CDragDrop(void)
  92. {
  93.     IsOurDrag = FALSE;
  94.     DragOkay = FALSE;
  95.     DragTrackingHandler = NULL;
  96.     DragReceiveHandler = NULL;
  97. }
  98.  
  99.  
  100. /**[r******************************************************************
  101.  * DisposeDragDrop
  102.  *
  103.  * DESCRIPTION: Destructor
  104.  *
  105.  **r]*******************************************************************/
  106. void CDragDrop::DisposeDragDrop(void)
  107. {
  108.     if ( DragTrackingHandler )
  109.     {
  110.         RemoveTrackingHandler(DragTrackingHandler, Window);
  111.         DisposeRoutineDescriptor(DragTrackingHandler);
  112.         DragTrackingHandler = NULL;
  113.     }
  114.     if ( DragReceiveHandler )
  115.     {
  116.         RemoveReceiveHandler(DragReceiveHandler, Window);
  117.         DisposeRoutineDescriptor(DragReceiveHandler);
  118.         DragReceiveHandler = NULL;
  119.     }
  120.     delete this;
  121. }
  122.  
  123. /**[r******************************************************************
  124.  * EnterWindow
  125.  *
  126.  * DESCRIPTION: Handle a begin enter window message
  127.  *
  128.  *
  129.  **r]*******************************************************************/
  130. void CDragDrop::EnterWindow(DragReference DragRef, WindowPtr pWindow)
  131. {
  132.     RgnHandle        TempRgn;
  133.     GrafPtr            SavePort;
  134.     DragAttributes    Attributes;
  135.     
  136.     ::GetDragAttributes(DragRef, &Attributes);
  137.     
  138.     DragOkay = ( DragItemsOkay(DragRef) && (Attributes & dragHasLeftSenderWindow) &&
  139.                  !IsOurDrag );
  140.  
  141.     if ( DragOkay )
  142.     {
  143.         ::GetPort(&SavePort);
  144.         ::SetPort(pWindow);
  145.         
  146.         TempRgn = ::NewRgn();
  147.         ::RectRgn(TempRgn, &pWindow->portRect);
  148.         ::ShowDragHilite(DragRef, TempRgn, TRUE);
  149.         ::DisposeRgn(TempRgn);
  150.         
  151.         ::SetPort(SavePort);
  152.     }
  153. }
  154.  
  155.  
  156. /**[r******************************************************************
  157.  * LeaveWindow
  158.  *
  159.  * DESCRIPTION: Handle a exit window message
  160.  *
  161.  *
  162.  **r]*******************************************************************/
  163. void CDragDrop::LeaveWindow(DragReference DragRef)
  164. {
  165.     if ( DragOkay )
  166.         ::HideDragHilite(DragRef);
  167.     DragOkay = FALSE;
  168. }
  169.  
  170.  
  171. /**[r******************************************************************
  172.  * Drop
  173.  *
  174.  * DESCRIPTION: Handle a enter window message
  175.  *
  176.  *
  177.  **r]*******************************************************************/
  178. void CDragDrop::Drop(DragReference DragRef)
  179. {
  180.     HFSFlavor        FSData;
  181.     Size            DataSize = sizeof(HFSFlavor);
  182.     ItemReference    ItemRef;
  183.     OSErr            Result;
  184.  
  185.     Result = GetDragItemReferenceNumber(DragRef, 1, &ItemRef);
  186.     
  187.     if (Result == noErr &&
  188.         ::GetFlavorData(DragRef, ItemRef, flavorTypeHFS, &FSData, &DataSize, 0L) == noErr)
  189.         CreateControlFromFileSpec(&FSData.fileSpec);
  190. }
  191.  
  192.  
  193. /**[r******************************************************************
  194.  * DragItemsOkay
  195.  *
  196.  * DESCRIPTION: Returns TRUE if drag items are acceptable
  197.  *
  198.  *
  199.  **r]*******************************************************************/
  200. Boolean CDragDrop::DragItemsOkay(DragReference DragRef)
  201. {
  202.     Boolean         Okay = FALSE;
  203.     OSErr            Result;
  204.     unsigned short    NumItems;
  205.     ItemReference    ItemRef;
  206.     FlavorFlags        Flavor;
  207.     
  208.     Result = ::CountDragItems(DragRef, &NumItems);
  209.     if ( Result == noErr && NumItems == 1 )
  210.     {
  211.         Result = ::GetDragItemReferenceNumber(DragRef, 1, &ItemRef);
  212.         if ( Result == noErr )
  213.         {
  214.             if (::GetFlavorFlags( DragRef, ItemRef, flavorTypeHFS, &Flavor) == noErr)
  215.             {
  216.                 HFSFlavor    FSData;
  217.                 Size        DataSize = sizeof(HFSFlavor);
  218.  
  219.                 if (::GetFlavorData( DragRef, ItemRef, flavorTypeHFS, &FSData, &DataSize, 0L) == noErr
  220.                     && FSData.fileType == 'shlb' && FSData.fileCreator == 'cfmg')
  221.                     return true;
  222.             }
  223.         }
  224.     } 
  225.     
  226.     return Okay;
  227. }
  228.  
  229.  
  230.  
  231. /**[r******************************************************************
  232.  * drag_HandleTrack
  233.  *
  234.  * DESCRIPTION: Mac drag manager callback handler
  235.  *
  236.  *
  237.  **r]*******************************************************************/
  238. pascal OSErr drag_HandleTrack(DragTrackingMessage Message, WindowPtr pWindow, void* HandlerRefCon, DragReference DragRef)
  239. {
  240.     CDragDrop*    pDragDrop = (CDragDrop*) HandlerRefCon;
  241.     
  242.     switch (Message)
  243.     {
  244.         case dragTrackingEnterHandler:
  245.             break;
  246.             
  247.         case dragTrackingEnterWindow:
  248.             pDragDrop->EnterWindow(DragRef, pWindow);
  249.             break;
  250.             
  251.         case dragTrackingInWindow:
  252.             break;
  253.             
  254.         case dragTrackingLeaveWindow:
  255.             pDragDrop->LeaveWindow(DragRef);
  256.             break;
  257.             
  258.         case dragTrackingLeaveHandler:
  259.             break;
  260.             
  261.         default:
  262.             break;
  263.             
  264.     }
  265.  
  266.     return noErr;
  267. }
  268.  
  269. /**[r******************************************************************
  270.  * drag_HandleDrop
  271.  *
  272.  * DESCRIPTION: Handle a drop on a window
  273.  *
  274.  *
  275.  **r]*******************************************************************/
  276. pascal OSErr drag_HandleDrop(WindowPtr pWindow, void* HandlerRefCon, DragReference DragRef)
  277. {
  278.     CDragDrop* pDragDrop = (CDragDrop*) HandlerRefCon;
  279.  
  280.     pDragDrop->Drop(DragRef);
  281.     HideDragHilite(DragRef);
  282.     EraseRect(&pWindow->portRect);
  283.     InvalRect(&pWindow->portRect);
  284.  
  285.     return noErr;
  286. }
  287.  
  288.  
  289.  
  290.